#include <cstdlib>
#include <iostream>
#include "Latar/Latar.h"
#include "Bidang/Bidang.h"
#include "Sel/Sel.h"
#include "Point/Point.h"

using namespace std;

int main(){
    Latar L;
    int i,Sudut;
    int mulai = 0;

    //meminta jumlah sudut
    cout <<"Masukkan kode bidang : "<< endl;
    cin >> Sudut;
    Point Arr[Sudut+5], Ubah[Sudut+5];

    //membuat bidang
    bool flag = true;
    do {
        for(i=0;i<Sudut;i++){
            cout << "Titik " << i+1 << " : ";
            int x,y;
            cin >> x >> y;
            Arr[i].setPoint(x,y);
            if ((y < Arr[mulai].getOrdinat())||((y == Arr[mulai].getOrdinat())&&(x < Arr[mulai].getAbsis()))) mulai = i;
            flag = flag && L.IsPointIn(Arr[i]);
        }
        
        if (!flag) {
            cout<<"Ada titik yang terletak di luar batas"<<endl;
            cout<<"Batas koordinat adalah (0,0) sampai (19,39)"<<endl;
        }
    } while (!flag);

    if (Sudut == 2) {
        Sudut = 4;
        
        int x1 = Arr[0].getAbsis();
        int x2 = Arr[1].getAbsis();
        if (x1 > x2) {
            int temp = x1;
            x1 = x2;
            x2 = temp;
        }
        
        int y1 = Arr[0].getOrdinat();
        int y2 = Arr[1].getOrdinat();
        if (y1 > y2) {
            int temp = y1;
            y1 = y2;
            y2 = temp;
        }        
        
        Ubah[0].setPoint(x1,y1);
        Ubah[1].setPoint(x2,y1);
        Ubah[2].setPoint(x2,y2);
        Ubah[3].setPoint(x1,y2);
    } else {
        for (int i=0;i<Sudut;++i) {
            Ubah[i] = Arr[mulai];
            mulai = (mulai+1) % Sudut; 
        }
        Ubah[Sudut] = Ubah[0];
        
        int luas = 0;
        for (int i=0;i<Sudut;++i) {
            luas += (Ubah[i].getAbsis()*Ubah[i+1].getOrdinat() - Ubah[i+1].getAbsis()*Ubah[i].getOrdinat());
        }

        if (luas < 0) {
            int kiri = 1;
            int kanan = Sudut-1;
        
            while (kiri < kanan) {
                Point temp = Ubah[kiri];
                Ubah[kiri] = Ubah[kanan];
                Ubah[kanan] = temp;
                ++kiri;
                --kanan;
            }
        }
    }

    Bidang B(Sudut,Ubah);
    L.AddBidang(&B);
    L.Draw();

    
    char pilihan = 'X';
    //loop
    while(pilihan!='Q') {
        //meminta opsi
        //L.Draw();
        cout <<"masukkan pilihan anda"<< endl;
        cout <<"1. tekan Q untuk exit."<<endl;
        cout <<"2. tekan E untuk menghapus isi bidang."<< endl;
        cout <<"3. tekan F untuk mengisi bidang dengan '*'."<< endl;
        cout <<"4. tekan C untuk menghitung rasio karakter/blank bidang-latar."<< endl;
        cout <<"5. tekan S untuk menghitung rasio blank/karakter bidang-latar."<< endl;
        //cout <<"5. tekan M untuk menggeser."<< endl;
        cout <<"pilihan anda?"<< endl;
        cin >> pilihan;
		switch(pilihan) {
        case 'E':
            cout <<"mengkosongkan isi bidang"<< endl;
            L.ClearAll();
            L.Draw();
        break;
        case 'F':
            cout <<"Mengisi karakter blank Latar dengan '*'"<< endl;
            L.Draw('*');
        break;
        case 'C':
            L.Draw();
            cout <<"Rasio kepadatan karakter non-blank/blank bidang : "<< endl;
            L.ComputeC();
        break;
        case 'S':
            L.Draw();
            cout <<"Rasio kepadatan karakter non-blank / luas latar : "<< endl;
            L.ComputeS();
        break;
        case 'M':
            cout << "Masukkan besar perpindahan pada x : ";
            int x,y;
            cin >> x;
            
            cout << "Masukkan besar perpindahan pada y : ";
            cin >> y;
            
            bool flag;
            //Checking dulu, perlu 
            //min dan max dari x day y Point2 Bidang
            //caranya coba diandaikan ada Point(minx,miny) dan Point(maxx,maxy)
            //Kalo dipindahin dengan x dan y, hasilnya keluar bidang atau tidak.
            //Kalo keluar artinya tidak sah
            //flag buat menyimpan hasil validasi, kalo sah true
            
            if (flag) {
                B.Move(x,y);
                L.Draw();
            } else {
                cout<<"Perpindahan menyebabkan Bidang keluar batas Latar."<<endl;
            }
        break;
        }
    }

    cout <<"bye.."<< endl;
    return 0;
}

